<?php

class Cliente {

    public function post_save($cliente) {

        if ($cliente->idCliente) {


            //verifica se o login foi alterado, e se foi, deve verificar
            // se o login já existe para outro usuário
            $sqlUsuario  = "SELECT id,login FROM usuarios WHERE id=:id";
            $stmtUsuario = DB::prepare($sqlUsuario);
            $stmtUsuario->bindParam("id", $cliente->idUsuario);
            $stmtUsuario->execute();
            $usuario     = $stmtUsuario->fetch();
            if ($usuario->login != $cliente->login) {
                $sqlSelect  = "SELECT id,nome FROM usuarios WHERE (login=:login)";
                $stmtSelect = DB::prepare($sqlSelect);
                $stmtSelect->bindValue("login", $cliente->login);
                $stmtSelect->execute();
                $usuario    = $stmtSelect->fetch();
                if ($usuario)
                    throw new Exception("Login pertencente ao usuário '{$usuario->nome}'");
            }

            //update
            $sqlUpdateUsuario = "UPDATE usuarios SET nome=:nome,email=:email,login=:login,senha=:senha WHERE id=:idUsuario";

            $sqlUpdateCliente = "UPDATE clientes SET rua=:rua,numero=:numero,complemento=:complemento,bairro=:bairro,cep=:cep,uf=:uf,cidade=:cidade,
                telefone=:telefone,telefoneAlternativo=:telefoneAlternativo,email=:email,emailAlternativo=:emailAlternativo,celular=:celular,
                operadora=:operadora,celularAlternativo=:celularAlternativo,operadoraFoneAlternativo=:operadoraFoneAlternativo,observacao=:observacao,
                dataNascAbertura=:dataNascAbertura,rgInscrEst=:rgInscrEst,profissaoAreaAtuacao=:profissaoAreaAtuacao,empresa=:empresa,sexo=:sexo,tipoPessoa=:tipoPessoa,
                cpfCnpj=:cpfCnpj,recolocado=:recolocado WHERE id=:idCliente";
            try {

                DB::beginTransaction();

                $stmtUsuario = DB::prepare($sqlUpdateUsuario);
                $stmtUsuario->bindParam("nome", $cliente->nome);
                $stmtUsuario->bindParam("email", $cliente->email);
                $stmtUsuario->bindParam("login", $cliente->login);
                $stmtUsuario->bindParam("senha", $cliente->senha);
                $stmtUsuario->bindParam("idUsuario", $cliente->idUsuario);
                $stmtUsuario->execute();

                $stmtUsuario = DB::prepare($sqlUpdateCliente);
                $stmtUsuario->bindParam("rua", $cliente->rua);
                $stmtUsuario->bindParam("numero", $cliente->numero);
                $stmtUsuario->bindParam("complemento", $cliente->complemento);
                $stmtUsuario->bindParam("bairro", $cliente->bairro);
                $stmtUsuario->bindParam("cep", $cliente->cep);
                $stmtUsuario->bindParam("uf", $cliente->uf);
                $stmtUsuario->bindParam("cidade", $cliente->cidade);
                $stmtUsuario->bindParam("telefone", $cliente->telefone);
                $stmtUsuario->bindParam("telefoneAlternativo", $cliente->telefoneAlternativo);
                $stmtUsuario->bindParam("email", $cliente->email);
                $stmtUsuario->bindParam("emailAlternativo", $cliente->emailAlternativo);
                $stmtUsuario->bindParam("celular", $cliente->celular);
                $stmtUsuario->bindParam("operadora", $cliente->operadora);
                $stmtUsuario->bindParam("celularAlternativo", $cliente->celularAlternativo);
                $stmtUsuario->bindParam("operadoraFoneAlternativo", $cliente->operadoraFoneAlternativo);
                $stmtUsuario->bindParam("observacao", $cliente->observacao);
                $stmtUsuario->bindParam("dataNascAbertura", $cliente->dataNascAbertura);
                $stmtUsuario->bindParam("rgInscrEst", $cliente->rgInscrEst);
                $stmtUsuario->bindParam("profissaoAreaAtuacao", $cliente->profissaoAreaAtuacao);
                $stmtUsuario->bindParam("empresa", $cliente->empresa);
                $stmtUsuario->bindParam("sexo", $cliente->sexo);
                $stmtUsuario->bindParam("tipoPessoa", $cliente->tipoPessoa);
                $stmtUsuario->bindParam("cpfCnpj", $cliente->cpfCnpj);
                $stmtUsuario->bindParam("idCliente", $cliente->idCliente);
                $stmtUsuario->bindParam("recolocado", $cliente->recolocado);
                $stmtUsuario->execute();


                DB::commit();
            }
            catch (Exception $e) {
                DB::rollBack();
                throw new Exception($e->getMessage());
            }
        }
        else {
            //Verificar se login já existem
            $sqlSelect  = "SELECT id,nome FROM usuarios where (login=:login)";
            $stmtSelect = DB::prepare($sqlSelect);
            $stmtSelect->bindValue("login", $cliente->login);
            $stmtSelect->execute();
            $usuario    = $stmtSelect->fetch();
            if ($usuario)
                throw new Exception("Login pertencente ao usuário '{$usuario->nome}'");

            //Se já existir um cliente com mesmo nome    
            $sqlRegistroDuplo  = "SELECT id,nome FROM usuarios where (nome =:nome)";
            $stmtRegistroDuplo = DB::prepare($sqlRegistroDuplo);
            $stmtRegistroDuplo->bindValue("nome", $cliente->nome);
            $stmtRegistroDuplo->execute();
            $clienteDuplo      = $stmtRegistroDuplo->fetch();
            if ($clienteDuplo)
                throw new Exception("Ops! este cliente já existe.");


            //insert
            $sqlInsertUsuario  = "INSERT INTO usuarios (nome,email,login,senha,tipo) VALUES (:nome,:email,:login,:senha,:tipo)";
            $sqlInsertCliente  = "INSERT INTO clientes (idUsuario,rua,numero,complemento,bairro,cep,uf,cidade,telefone,telefoneAlternativo,email,emailAlternativo,
                celular,operadora,celularAlternativo,operadoraFoneAlternativo,observacao,dataNascAbertura,rgInscrEst,profissaoAreaAtuacao,empresa,sexo,tipoPessoa,
                cpfCnpj,recolocado) VALUES (:idUsuario,:rua,:numero,:complemento,:bairro,:cep,:uf,:cidade,:telefone,:telefoneAlternativo,:email,:emailAlternativo,
                :celular,:operadora,:celularAlternativo,:operadoraFoneAlternativo,:observacao,:dataNascAbertura,:rgInscrEst,:profissaoAreaAtuacao,:empresa,
                :sexo,:tipoPessoa,:cpfCnpj,:recolocado)";
            $sqlInsertParabens = "INSERT INTO parabens (idCliente,parabenizado) VALUES (:idCliente,FALSE)";
            try {

                DB::beginTransaction();

                $cliente->ativo = "1";
                $cliente->tipo  = "c";

                $stmtUsuario = DB::prepare($sqlInsertUsuario);
                $stmtUsuario->bindParam("nome", $cliente->nome);
                $stmtUsuario->bindParam("email", $cliente->email);
                $stmtUsuario->bindParam("login", $cliente->login);
                $stmtUsuario->bindParam("senha", $cliente->senha);
                $stmtUsuario->bindParam("tipo", $cliente->tipo);

                $stmtUsuario->execute();

                $cliente->idUsuario = DB::lastInsertId();

                $stmtUsuario = DB::prepare($sqlInsertCliente);
                $stmtUsuario->bindParam("idUsuario", $cliente->idUsuario);
                $stmtUsuario->bindParam("rua", $cliente->rua);
                $stmtUsuario->bindParam("numero", $cliente->numero);
                $stmtUsuario->bindParam("complemento", $cliente->complemento);
                $stmtUsuario->bindParam("bairro", $cliente->bairro);
                $stmtUsuario->bindParam("cep", $cliente->cep);
                $stmtUsuario->bindParam("uf", $cliente->uf);
                $stmtUsuario->bindParam("cidade", $cliente->cidade);
                $stmtUsuario->bindParam("telefone", $cliente->telefone);
                $stmtUsuario->bindParam("telefoneAlternativo", $cliente->telefoneAlternativo);
                $stmtUsuario->bindParam("email", $cliente->email);
                $stmtUsuario->bindParam("emailAlternativo", $cliente->emailAlternativo);
                $stmtUsuario->bindParam("celular", $cliente->celular);
                $stmtUsuario->bindParam("operadora", $cliente->operadora);
                $stmtUsuario->bindParam("celularAlternativo", $cliente->celularAlternativo);
                $stmtUsuario->bindParam("operadoraFoneAlternativo", $cliente->operadoraFoneAlternativo);
                $stmtUsuario->bindParam("observacao", $cliente->observacao);
                $stmtUsuario->bindParam("dataNascAbertura", $cliente->dataNascAbertura);
                $stmtUsuario->bindParam("rgInscrEst", $cliente->rgInscrEst);
                $stmtUsuario->bindParam("profissaoAreaAtuacao", $cliente->profissaoAreaAtuacao);
                $stmtUsuario->bindParam("empresa", $cliente->empresa);
                $stmtUsuario->bindParam("sexo", $cliente->sexo);
                $stmtUsuario->bindParam("tipoPessoa", $cliente->tipoPessoa);
                $stmtUsuario->bindParam("cpfCnpj", $cliente->cpfCnpj);
                $stmtUsuario->bindParam("recolocado", $cliente->recolocado);
                $stmtUsuario->execute();

                $cliente->id = DB::lastInsertId();

                $stmtParabens = DB::prepare($sqlInsertParabens);
                $stmtParabens->bindParam("idCliente", $cliente->id);
                $stmtParabens->execute();

                DB::commit();
            }
            catch (Exception $e) {
                DB::rollBack();
                throw new Exception($e->getMessage());
            }

            return $cliente;
        }
    }

    function post_birthday($aniversariante) {

        $sqlUpdClienteParabenizado = "UPDATE parabens SET 
            parabenizado = TRUE, 
            anoParabenizacao = :anoParabenizacao,
            idUsuario = :idUsuario
            WHERE idCliente = :idCliente";

        try {
            date_default_timezone_set('America/Sao_Paulo');
            $stmtUpdClienteParabenizado = DB::prepare($sqlUpdClienteParabenizado);
            $stmtUpdClienteParabenizado->bindParam("idCliente", $aniversariante->idCliente);
            $stmtUpdClienteParabenizado->bindParam("anoParabenizacao", date("Y"));
            $stmtUpdClienteParabenizado->bindParam("idUsuario", $aniversariante->idUsuario);
            $stmtUpdClienteParabenizado->execute();
        }
        catch (Exception $e) {
            throw new Exception($e->getMessage());
        }
    }

    function get_listBirthday() {

        date_default_timezone_set('America/Sao_Paulo');
        $sql  = "SELECT u.nome,DATE_FORMAT(c.dataNascAbertura, '%d/%m/%Y')as dataNascAbertura,c.email,c.id,u.id as idUsuario,u.tipo FROM 
            clientes c INNER JOIN usuarios u ON c.idUsuario = u.id
            LEFT JOIN parabens p ON c.id = p.idCliente
            WHERE DATE_FORMAT(c.dataNascAbertura, '%d/%m') = :dataAtual 
            AND p.parabenizado = FALSE AND p.anoParabenizacao IS NULL OR p.anoParabenizacao < :anoAtual ";
        $stmt = DB::prepare($sql);
        $stmt->bindParam("dataAtual", date("d/m"));
        $stmt->bindParam("anoAtual", date("Y"));
        $stmt->execute();
        if ($stmt->rowCount() > 0)
            return ($stmt->fetchAll());
        else
            throw new Exception();
    }

    function get_list($id) {

        $sql  = "SELECT c.id,u.nome,c.email,c.dataNascAbertura,c.sexo,c.cpfCnpj,c.profissaoAreaAtuacao,c.empresa,c.rgInscrEst,c.rua,c.numero,c.complemento,
            c.bairro,c.cep,c.uf,c.cidade,c.telefone,c.telefoneAlternativo,c.celular,c.operadora,c.celularAlternativo,c.operadoraFoneAlternativo,
            c.emailAlternativo,c.observacao,c.tipoPessoa,c.recolocado,u.login,u.senha,u.id as idUsuario 
            FROM usuarios u, clientes c WHERE u.id=c.idUsuario AND c.id=:id";
        $stmt = DB::prepare($sql);
        $stmt->bindParam("id", $id);
        $stmt->execute();
        return($stmt->fetch());
    }

    function get_listClienteTipo($tipoCliente) {
        if ($tipoCliente != "recolocado")
            $sql = "SELECT c.id,u.nome,c.email,c.dataNascAbertura,c.sexo,c.cpfCnpj,c.profissaoAreaAtuacao,c.empresa,c.rgInscrEst,c.rua,c.numero,c.complemento,
            c.bairro,c.cep,c.uf,c.cidade,c.telefone,c.telefoneAlternativo,c.celular,c.operadora,c.celularAlternativo,c.operadoraFoneAlternativo,
            c.emailAlternativo,c.observacao,c.tipoPessoa,c.recolocado,u.login,u.senha,u.id as idUsuario 
            FROM usuarios u, clientes c WHERE u.id=c.idUsuario AND c.tipoPessoa = :tipoCliente";
        else
            $sql = "SELECT c.id,u.nome,c.email,c.dataNascAbertura,c.sexo,c.cpfCnpj,c.profissaoAreaAtuacao,c.empresa,c.rgInscrEst,c.rua,c.numero,c.complemento,
            c.bairro,c.cep,c.uf,c.cidade,c.telefone,c.telefoneAlternativo,c.celular,c.operadora,c.celularAlternativo,c.operadoraFoneAlternativo,
            c.emailAlternativo,c.observacao,c.tipoPessoa,c.recolocado,u.login,u.senha,u.id as idUsuario 
            FROM usuarios u, clientes c WHERE u.id=c.idUsuario AND c.recolocado = true";

        $stmt = DB::prepare($sql);
        $stmt->bindParam("tipoCliente", $tipoCliente);
        $stmt->execute();
        return($stmt->fetchAll());
    }

    function get_listAll() {

//        $sql    = "SELECT c.id,u.nome,u.login,u.senha,c.celular,c.telefone,c.tipoPessoa,c.recolocado,u.id as idUsuario FROM usuarios u, 
//                clientes c WHERE u.id=c.idUsuario";

        $sql    = "SELECT c.id,u.nome,u.login,u.senha,c.celular,c.telefone,c.tipoPessoa,c.recolocado,u.id as idUsuario FROM usuarios u
                   INNER JOIN clientes c ON u.id = c.idUsuario";
        $stmt   = DB::prepare($sql);
        $stmt->execute();
        $result = $stmt->fetchAll();
        return $result;
    }

    function post_delete($cliente) {
        $sqlDeleteParabens = "DELETE FROM parabens WHERE idCliente = :idCliente";
        $sqlDeleteCliente  = "DELETE FROM clientes WHERE id = :id";
        $sqlDeleteUsuario  = "DELETE FROM usuarios WHERE id = :idUsuario";
        try {

            DB::beginTransaction();

            $stmt = DB::prepare($sqlDeleteParabens);
            $stmt->bindParam("idCliente", $cliente->id);
            $stmt->execute();

            $stmt = DB::prepare($sqlDeleteCliente);
            $stmt->bindParam("id", $cliente->id);
            $stmt->execute();

            $stmt = DB::prepare($sqlDeleteUsuario);
            $stmt->bindParam("idUsuario", $cliente->idUsuario);
            $stmt->execute();

            DB::commit();
        }
        catch (Exception $e) {
            DB::rollBack();
            throw new Exception($e->getMessage());
        }
    }

    function post_search($data) {
        $data->busca = "%{$data->busca}%";
        $sql         = "SELECT c.id,u.nome,u.login,u.id as idUsuario FROM usuarios u, clientes c WHERE u.id=c.idUsuario AND (u.nome LIKE :busca OR c.cpfCnpj LIKE :busca)";
        $stmt        = DB::prepare($sql);
        $stmt->bindParam("busca", $data->busca);
        $stmt->execute();
        return $stmt->fetchAll();
    }

    function post_geraLoginSenha($cliente) {
        if (!$cliente->idCliente) {
            $letters            = 'abcefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
            $login              = substr(str_shuffle($letters), 0, 8);
            $senha              = substr(str_shuffle($letters), 0, 8);
            $cliente->idCliente = null;
            $cliente->login     = $login;
            $cliente->senha     = $senha;
        }
        return $this->post_save($cliente);
    }

    //método utilizado somente para inserir os id's dos clientes na tabela parabens
    function post_id() {
        try {
            DB::beginTransaction();
            $sqlId  = "SELECT id FROM clientes";
            $stmtId = DB::prepare($sqlId);
            $stmtId->execute();
            $id     = $stmtId->fetchAll();



            foreach ($id as $listaId) {
                $sql  = "INSERT INTO parabens (idCliente,parabenizado) VALUES (:idCliente,FALSE)";
                $stmt = DB::prepare($sql);
                $stmt->bindParam("idCliente", $listaId->id);
                $stmt->execute();
            }
            DB::commit();
        }
        catch (Exception $e) {
            DB::rollBack();
            echo $e->getTraceAsString();
        }
    }

}